# 基于 NVIDIA CUDA 12.4.1 和 cuDNN 开发环境的 Ubuntu 22.04 镜像
# 这个镜像包含了 CUDA 工具包和深度学习所需的 cuDNN 库
FROM nvidia/cuda:12.4.1-cudnn-devel-ubuntu22.04

# 定义虚拟环境名称参数，默认为 "cosyvoice"
ARG VENV_NAME="cosyvoice"
# 设置环境变量，指定虚拟环境名称
ENV VENV=$VENV_NAME
# 设置系统语言环境为 UTF-8，确保中文显示正常
ENV LANG=C.UTF-8 LC_ALL=C.UTF-8

# 设置 Debian 包管理器为非交互模式，避免安装过程中的用户交互
ENV DEBIAN_FRONTEN=noninteractive
# 设置 Python 输出不缓冲，确保日志实时显示
ENV PYTHONUNBUFFERED=1
# 设置默认 shell 为 bash，并启用登录模式
SHELL ["/bin/bash", "--login", "-c"]

# 配置阿里云镜像源，加速软件包下载
# 将 Ubuntu 官方软件源替换为阿里云镜像
RUN sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
RUN sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list

# 更新软件包列表，修复缺失的包
RUN apt-get update -y --fix-missing
# 安装系统依赖包
# git: 版本控制工具
# build-essential: 编译工具链
# curl, wget: 网络下载工具
# ffmpeg: 音视频处理工具
# unzip: 解压工具
# sox, libsox-dev: 音频处理库
# git-lfs: Git 大文件存储
RUN apt-get install -y git build-essential curl wget ffmpeg unzip git git-lfs sox libsox-dev && \
    apt-get clean && \
    git lfs install

# ==================================================================
# 安装 conda 并设置 conda-forge 为默认频道
# ------------------------------------------------------------------
# 下载并安装 Miniforge（conda 的轻量级版本）
RUN wget --quiet https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-x86_64.sh -O ~/miniforge.sh && \
    /bin/bash ~/miniforge.sh -b -p /opt/conda && \
    rm ~/miniforge.sh && \
    ln -s /opt/conda/etc/profile.d/conda.sh /etc/profile.d/conda.sh && \
    echo "source /opt/conda/etc/profile.d/conda.sh" >> /opt/nvidia/entrypoint.d/100.conda.sh && \
    echo "source /opt/conda/etc/profile.d/conda.sh" >> ~/.bashrc && \
    echo "conda activate ${VENV}" >> /opt/nvidia/entrypoint.d/110.conda_default_env.sh && \
    echo "conda activate ${VENV}" >> $HOME/.bashrc

# 将 conda 路径添加到系统 PATH 环境变量
ENV PATH=/opt/conda/bin:$PATH

# 配置 conda 使用 conda-forge 频道，并设置严格的频道优先级
RUN conda config --add channels conda-forge && \
    conda config --set channel_priority strict
# ------------------------------------------------------------------
# ~conda 安装完成
# ==================================================================

# 创建 Python 3.10 的 conda 虚拟环境
RUN conda create -y -n ${VENV} python=3.10
# 设置默认的 conda 环境
ENV CONDA_DEFAULT_ENV=${VENV}
# 更新 PATH 环境变量，包含 conda 和虚拟环境的路径
ENV PATH=/opt/conda/bin:/opt/conda/envs/${VENV}/bin:$PATH

# 设置工作目录为 /workspace
WORKDIR /workspace

# 设置 Python 路径，包含项目目录和第三方库路径
RUN export PYTHONPATH="${PYTHONPATH}:/workspace/CosyVoice:/workspace/CosyVoice/third_party/Matcha-TTS"

# 克隆 CosyVoice2-Ex 项目仓库（包含子模块）
RUN git clone --recursive https://github.com/journey-ad/CosyVoice2-Ex.git

# 在虚拟环境中安装 pynini 库（版本 2.1.5），用于文本处理
RUN conda activate ${VENV} && conda install -y -c conda-forge pynini==2.1.5
# 激活虚拟环境，进入项目目录，使用阿里云镜像源安装 Python 依赖包
RUN conda activate ${VENV} && cd CosyVoice2-Ex && \
    pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/ --trusted-host=mirrors.aliyun.com

# 设置工作目录为项目根目录
WORKDIR /workspace/CosyVoice2-Ex

# 设置日志级别环境变量
ENV LOG_LEVEL=INFO

# 暴露 8080 端口，用于 Web 服务
EXPOSE 8080

# 容器启动命令：运行 Web UI 服务，监听 8080 端口
CMD ["sh", "-c", "python webui.py --port 8080 --log_level ${LOG_LEVEL}"]
